import statistics

import requests


# 1.40  获取调整后的单价
def calculate_adjusted_price(org_prices):
    """根据样本数量计算调整后单价"""
    # 系统参数设置
    IQR_SMALL = 1.5
    IQR_BIG = 1.0
    IQR_BIG_SUPER = 0.9

    n = len(org_prices)
    # 排序数据（后续步骤都需要排序）
    sorted_prices = sorted(org_prices)

    if n == 0:
        return None  # 没有有效数据

    # 2.1 当n < 30时：使用样本中位数
    if n < 30:
        return statistics.median(org_prices)

    # 2.2 当30 ≤ n < 100时
    if 30 <= n < 100:
        k = IQR_SMALL
        return calculate_with_iqr(sorted_prices, n, k)

    # 2.3 当100 ≤ n < 1000时
    elif 100 <= n < 1000:
        k = IQR_BIG
        return calculate_with_iqr(sorted_prices, n, k)

    # 2.4 当n ≥ 1000时
    else:
        alpha = IQR_BIG_SUPER
        # 计算需要剔除的数据量
        remove_count = int(n * (1 - alpha) / 2)
        # print("剔除前的list",sorted_prices)
        # 剔除前后的数据
        filtered_prices = sorted_prices[remove_count:-remove_count]
        # 排序后的列表
        # print("剔除后的list",filtered_prices)
        # 计算算术平均值
        return sum(filtered_prices) / len(filtered_prices)


def calculate_with_iqr(sorted_prices, n, k):
    """使用IQR方法计算调整后单价"""
    # 计算Q1
    q1_pos = (n + 1) * 0.25
    if q1_pos.is_integer():
        q1 = sorted_prices[int(q1_pos) - 1]
    else:
        s = int(q1_pos)
        q1 = sorted_prices[s - 1] + 0.25 * (sorted_prices[s] - sorted_prices[s - 1])

    # 计算Q3（修正：将0.25改为0.75）
    q3_pos = (n + 1) * 0.75
    if q3_pos.is_integer():
        q3 = sorted_prices[int(q3_pos) - 1]
    else:
        s = int(q3_pos)
        q3 = sorted_prices[s - 1] + 0.75 * (sorted_prices[s] - sorted_prices[s - 1])

    # 计算IQR
    iqr = q3 - q1

    # 计算上下限
    upper_limit = q3 + k * iqr
    lower_limit = q1 - k * iqr

    # 如果下限≤0，则取列表中的最小值作为下限
    if lower_limit <= 0:
        lower_limit = sorted_prices[0]

    # 剔除超出上下限的数据
    filtered_prices = [price for price in sorted_prices if lower_limit <= price <= upper_limit]

    # 计算算术平均值
    return sum(filtered_prices) / len(filtered_prices)


# 测试示例数据
test_url = "https://test.icii.agtsci.cn/api/cis/estimate/conversion/similar/material/pass"
prod_url = "https://icii.agt.cn/api/cis/estimate/conversion/similar/material/pass"

# 请求参数
payload = {
    "id": "7371025964253446144"
}

# 请求头
headers = {
    "Authorization": "bearer f4db62cd-ec11-40b6-81a3-a0834e8044be",
    "Content-Type": "application/json"  # 明确指定JSON内容类型
}

# 发送POST请求
response = requests.post(
    prod_url,
    json=payload,  # 使用json参数自动序列化并设置Content-Type
    headers=headers,
    timeout=10  # 超时设置
)
# 解析JSON响应
result = response.json()
print("请求成功！响应数据:", result)

# 提取orgPrice并过滤小于等于0的数据
org_prices = []
# 检查响应中是否包含data和list字段
if result.get("code") == 200 and "data" in result and "list" in result["data"]:
    for item in result["data"]["list"]:
        # 检查orgPrice是否存在且不为空
        if "orgPrice" in item and item["orgPrice"] is not None:
            try:
                # 将字符串转换为浮点数
                price = float(item["orgPrice"])
                # 只保留大于0的数据
                if price > 0:
                    org_prices.append(price)
            except ValueError:
                # 处理转换失败的情况
                print(f"无法转换为数字: {item['orgPrice']}")

print(f"orgPrice列表:{org_prices}")
print(f"orgPrice列表长度:{len(org_prices)}")

adjusted_price = calculate_adjusted_price(org_prices)

print(f"调整后单价: {adjusted_price}")
